home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / doom / quake_ad.zip / RESPAWN.ZIP / SRC / ENFORCER.QC < prev    next >
Text File  |  1997-03-17  |  15KB  |  442 lines

  1. /*
  2. ==============================================================================
  3.  
  4. SOLDIER / PLAYER
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. $cd id1/models/enforcer
  10. $origin 0 -6 24
  11. $base base        
  12. $skin skin
  13.  
  14. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7
  15.  
  16. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9 walk10
  17. $frame walk11 walk12 walk13 walk14 walk15 walk16
  18.  
  19. $frame run1 run2 run3 run4 run5 run6 run7 run8
  20.  
  21. $frame attack1 attack2 attack3 attack4 attack5 attack6
  22. $frame attack7 attack8 attack9 attack10
  23.  
  24. $frame death1 death2 death3 death4 death5 death6 death7 death8
  25. $frame death9 death10 death11 death12 death13 death14
  26.  
  27. $frame fdeath1 fdeath2 fdeath3 fdeath4 fdeath5 fdeath6 fdeath7 fdeath8
  28. $frame fdeath9 fdeath10 fdeath11
  29.  
  30. $frame paina1 paina2 paina3 paina4
  31.  
  32. $frame painb1 painb2 painb3 painb4 painb5
  33.  
  34. $frame painc1 painc2 painc3 painc4 painc5 painc6 painc7 painc8
  35.  
  36. $frame paind1 paind2 paind3 paind4 paind5 paind6 paind7 paind8
  37. $frame paind9 paind10 paind11 paind12 paind13 paind14 paind15 paind16
  38. $frame paind17 paind18 paind19
  39.  
  40. //--------------------------------------------------------- New Code --------
  41. void() enf_die15;
  42. void() enf_fdie12;
  43. //---------------------------------------------------------------------------
  44.  
  45.  
  46. void() Laser_Touch =
  47. {
  48.     local vector org;
  49.     
  50.     if (other == self.owner)
  51.         return;        // don't explode on owner
  52.  
  53.     if (pointcontents(self.origin) == CONTENT_SKY)
  54.     {
  55.         remove(self);
  56.         return;
  57.     }
  58.     
  59.     sound (self, CHAN_WEAPON, "enforcer/enfstop.wav", 1, ATTN_STATIC);
  60.     org = self.origin - 8*normalize(self.velocity);
  61.  
  62.     if (other.health)
  63.     {
  64.         SpawnBlood (org, self.velocity*0.2, 15);
  65.         T_Damage (other, self, self.owner, 15);
  66.     }
  67.     else
  68.     {
  69.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  70.         WriteByte (MSG_BROADCAST, TE_GUNSHOT);
  71.         WriteCoord (MSG_BROADCAST, org_x);
  72.         WriteCoord (MSG_BROADCAST, org_y);
  73.         WriteCoord (MSG_BROADCAST, org_z);
  74.     }
  75.     
  76.     remove(self);    
  77. };
  78.  
  79. void(vector org, vector vec) LaunchLaser =
  80. {
  81.     local    vector    vec;
  82.         
  83.     if (self.classname == "monster_enforcer")
  84.         sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
  85.  
  86.     vec = normalize(vec);
  87.     
  88.     newmis = spawn();
  89.     newmis.owner = self;
  90.     newmis.movetype = MOVETYPE_FLY;
  91.     newmis.solid = SOLID_BBOX;
  92.     newmis.effects = EF_DIMLIGHT;
  93.  
  94.     setmodel (newmis, "progs/laser.mdl");
  95.     setsize (newmis, '0 0 0', '0 0 0');        
  96.  
  97.     setorigin (newmis, org);
  98.  
  99.     newmis.velocity = vec * 600;
  100.     newmis.angles = vectoangles(newmis.velocity);
  101.  
  102.     newmis.nextthink = time + 5;
  103.     newmis.think = SUB_Remove;
  104.     newmis.touch = Laser_Touch;
  105. };
  106.  
  107.  
  108.  
  109. void() enforcer_fire =
  110. {
  111.     local vector org;
  112.  
  113.     self.effects = self.effects | EF_MUZZLEFLASH;
  114.     makevectors (self.angles);
  115.     
  116.     org = self.origin + v_forward * 30 + v_right * 8.5 + '0 0 16';
  117.  
  118.     LaunchLaser(org, self.enemy.origin - self.origin);
  119. };
  120.  
  121. //============================================================================
  122.  
  123. void()    enf_stand1    =[    $stand1,    enf_stand2    ] {ai_stand();};
  124. void()    enf_stand2    =[    $stand2,    enf_stand3    ] {ai_stand();};
  125. void()    enf_stand3    =[    $stand3,    enf_stand4    ] {ai_stand();};
  126. void()    enf_stand4    =[    $stand4,    enf_stand5    ] {ai_stand();};
  127. void()    enf_stand5    =[    $stand5,    enf_stand6    ] {ai_stand();};
  128. void()    enf_stand6    =[    $stand6,    enf_stand7    ] {ai_stand();};
  129. void()    enf_stand7    =[    $stand7,    enf_stand1    ] {ai_stand();};
  130.  
  131. void()    enf_walk1    =[    $walk1 ,    enf_walk2    ] {
  132. if (random() < 0.2)
  133.     sound (self, CHAN_VOICE, "enforcer/idle1.wav", 1, ATTN_IDLE);
  134. ai_walk(2);};
  135. void()    enf_walk2    =[    $walk2 ,    enf_walk3    ] {ai_walk(4);};
  136. void()    enf_walk3    =[    $walk3 ,    enf_walk4    ] {ai_walk(4);};
  137. void()    enf_walk4    =[    $walk4 ,    enf_walk5    ] {ai_walk(3);};
  138. void()    enf_walk5    =[    $walk5 ,    enf_walk6    ] {ai_walk(1);};
  139. void()    enf_walk6    =[    $walk6 ,    enf_walk7    ] {ai_walk(2);};
  140. void()    enf_walk7    =[    $walk7 ,    enf_walk8    ] {ai_walk(2);};
  141. void()    enf_walk8    =[    $walk8 ,    enf_walk9    ] {ai_walk(1);};
  142. void()    enf_walk9    =[    $walk9 ,    enf_walk10    ] {ai_walk(2);};
  143. void()    enf_walk10    =[    $walk10,    enf_walk11    ] {ai_walk(4);};
  144. void()    enf_walk11    =[    $walk11,    enf_walk12    ] {ai_walk(4);};
  145. void()    enf_walk12    =[    $walk12,    enf_walk13    ] {ai_walk(1);};
  146. void()    enf_walk13    =[    $walk13,    enf_walk14    ] {ai_walk(2);};
  147. void()    enf_walk14    =[    $walk14,    enf_walk15    ] {ai_walk(3);};
  148. void()    enf_walk15    =[    $walk15,    enf_walk16    ] {ai_walk(4);};
  149. void()    enf_walk16    =[    $walk16,    enf_walk1    ] {ai_walk(2);};
  150.  
  151. void()    enf_run1    =[    $run1  ,    enf_run2    ] {
  152. if (random() < 0.2)
  153.     sound (self, CHAN_VOICE, "enforcer/idle1.wav", 1, ATTN_IDLE);
  154. ai_run(18);};
  155. void()    enf_run2    =[    $run2  ,    enf_run3    ] {ai_run(14);};
  156. void()    enf_run3    =[    $run3  ,    enf_run4    ] {ai_run(7);};
  157. void()    enf_run4    =[    $run4  ,    enf_run5    ] {ai_run(12);};
  158. void()    enf_run5    =[    $run5  ,    enf_run6    ] {ai_run(14);};
  159. void()    enf_run6    =[    $run6  ,    enf_run7    ] {ai_run(14);};
  160. void()    enf_run7    =[    $run7  ,    enf_run8    ] {ai_run(7);};
  161. void()    enf_run8    =[    $run8  ,    enf_run1    ] {ai_run(11);};
  162.  
  163. void()    enf_atk1    =[    $attack1,    enf_atk2    ] {ai_face();};
  164. void()    enf_atk2    =[    $attack2,    enf_atk3    ] {ai_face();};
  165. void()    enf_atk3    =[    $attack3,    enf_atk4    ] {ai_face();};
  166. void()    enf_atk4    =[    $attack4,    enf_atk5    ] {ai_face();};
  167. void()    enf_atk5    =[    $attack5,    enf_atk6    ] {ai_face();};
  168. void()    enf_atk6    =[    $attack6,    enf_atk7    ] {enforcer_fire();};
  169. void()    enf_atk7    =[    $attack7,    enf_atk8    ] {ai_face();};
  170. void()    enf_atk8    =[    $attack8,    enf_atk9    ] {ai_face();};
  171. void()    enf_atk9    =[    $attack5,    enf_atk10    ] {ai_face();};
  172. void()    enf_atk10    =[    $attack6,    enf_atk11    ] {enforcer_fire();};
  173. void()    enf_atk11    =[    $attack7,    enf_atk12    ] {ai_face();};
  174. void()    enf_atk12    =[    $attack8,    enf_atk13    ] {ai_face();};
  175. void()    enf_atk13    =[    $attack9,    enf_atk14    ] {ai_face();};
  176. void()    enf_atk14    =[    $attack10,    enf_run1    ] {ai_face();
  177. SUB_CheckRefire (enf_atk1);
  178. };
  179.  
  180. void()    enf_paina1    =[    $paina1,    enf_paina2    ] {};
  181. void()    enf_paina2    =[    $paina2,    enf_paina3    ] {};
  182. void()    enf_paina3    =[    $paina3,    enf_paina4    ] {};
  183. void()    enf_paina4    =[    $paina4,    enf_run1    ] {};
  184.  
  185. void()    enf_painb1    =[    $painb1,    enf_painb2    ] {};
  186. void()    enf_painb2    =[    $painb2,    enf_painb3    ] {};
  187. void()    enf_painb3    =[    $painb3,    enf_painb4    ] {};
  188. void()    enf_painb4    =[    $painb4,    enf_painb5    ] {};
  189. void()    enf_painb5    =[    $painb5,    enf_run1    ] {};
  190.  
  191. void()    enf_painc1    =[    $painc1,    enf_painc2    ] {};
  192. void()    enf_painc2    =[    $painc2,    enf_painc3    ] {};
  193. void()    enf_painc3    =[    $painc3,    enf_painc4    ] {};
  194. void()    enf_painc4    =[    $painc4,    enf_painc5    ] {};
  195. void()    enf_painc5    =[    $painc5,    enf_painc6    ] {};
  196. void()    enf_painc6    =[    $painc6,    enf_painc7    ] {};
  197. void()    enf_painc7    =[    $painc7,    enf_painc8    ] {};
  198. void()    enf_painc8    =[    $painc8,    enf_run1    ] {};
  199.  
  200. void()    enf_paind1    =[    $paind1,    enf_paind2    ] {};
  201. void()    enf_paind2    =[    $paind2,    enf_paind3    ] {};
  202. void()    enf_paind3    =[    $paind3,    enf_paind4    ] {};
  203. void()    enf_paind4    =[    $paind4,    enf_paind5    ] {ai_painforward(2);};
  204. void()    enf_paind5    =[    $paind5,    enf_paind6    ] {ai_painforward(1);};
  205. void()    enf_paind6    =[    $paind6,    enf_paind7    ] {};
  206. void()    enf_paind7    =[    $paind7,    enf_paind8    ] {};
  207. void()    enf_paind8    =[    $paind8,    enf_paind9    ] {};
  208. void()    enf_paind9    =[    $paind9,    enf_paind10    ] {};
  209. void()    enf_paind10    =[    $paind10,    enf_paind11    ] {};
  210. void()    enf_paind11    =[    $paind11,    enf_paind12    ] {ai_painforward(1);};
  211. void()    enf_paind12    =[    $paind12,    enf_paind13    ] {ai_painforward(1);};
  212. void()    enf_paind13    =[    $paind13,    enf_paind14    ] {ai_painforward(1);};
  213. void()    enf_paind14    =[    $paind14,    enf_paind15    ] {};
  214. void()    enf_paind15    =[    $paind15,    enf_paind16    ] {};
  215. void()    enf_paind16    =[    $paind16,    enf_paind17    ] {ai_pain(1);};
  216. void()    enf_paind17    =[    $paind17,    enf_paind18    ] {ai_pain(1);};
  217. void()    enf_paind18    =[    $paind18,    enf_paind19    ] {};
  218. void()    enf_paind19    =[    $paind19,    enf_run1    ] {};
  219.  
  220. void(entity attacker, float damage)    enf_pain =
  221. {
  222.     local float r;
  223.  
  224.     r = random ();
  225.     if (self.pain_finished > time)
  226.         return;
  227.  
  228.     
  229.     if (r < 0.5)
  230.         sound (self, CHAN_VOICE, "enforcer/pain1.wav", 1, ATTN_NORM);
  231.     else
  232.         sound (self, CHAN_VOICE, "enforcer/pain2.wav", 1, ATTN_NORM);
  233.  
  234.     if (r < 0.2)
  235.     {
  236.         self.pain_finished = time + 1;
  237.         enf_paina1 ();
  238.     }
  239.     else if (r < 0.4)
  240.     {
  241.         self.pain_finished = time + 1;
  242.         enf_painb1 ();
  243.     }
  244.     else if (r < 0.7)
  245.     {
  246.         self.pain_finished = time + 1;
  247.         enf_painc1 ();
  248.     }
  249.     else
  250.     {
  251.         self.pain_finished = time + 2;
  252.         enf_paind1 ();
  253.     }
  254. };
  255.  
  256. //============================================================================
  257.  
  258.  
  259.  
  260.  
  261. //--------------------------------------------------------- New Code --------
  262. //  The enforcer is unstoppable!
  263. //---------------------------------------------------------------------------
  264. void()  enf_revive1  =[ $death14, enf_revive3  ]
  265. {       self.nextthink = self.nextthink + PM_SleepTime();
  266.         self.health = 0;
  267. };
  268. void()  enf_revive2  =[ $death14, enf_revive3  ]
  269. {       self.nextthink = self.nextthink + 5;    };
  270. void()  enf_revive3  =[ $death14, enf_revive4  ]
  271. {       // see if ok to stand up
  272.         self.health = 80;
  273.         sound (self, CHAN_VOICE, "enforcer/idle1.wav", 1, ATTN_IDLE);
  274.         self.solid = SOLID_SLIDEBOX;
  275.         if (!walkmove (0, 0))
  276.         {       self.think = enf_revive2;
  277.                 self.solid = SOLID_NOT;
  278.                 return;
  279.         }
  280. };
  281. void()  enf_revive4  =[ $death13, enf_revive5  ] {};
  282. void()  enf_revive5  =[ $death12, enf_revive6  ] {};
  283. void()  enf_revive6  =[ $death11, enf_revive7  ] {};
  284. void()  enf_revive7  =[ $death10, enf_revive8  ] {};
  285. void()  enf_revive8  =[ $death9,  enf_revive9  ] {ai_pain(3);};
  286. void()  enf_revive9  =[ $death8,  enf_revive10 ] {ai_pain(3);};
  287. void()  enf_revive10 =[ $death7,  enf_revive11 ] {ai_pain(2);};
  288. void()  enf_revive11 =[ $death6,  enf_revive12 ] {ai_pain(1);};
  289. void()  enf_revive12 =[ $death5,  enf_revive13 ] {};
  290. void()  enf_revive13 =[ $death4,  enf_revive14 ] {};
  291. void()  enf_revive14 =[ $death3,  enf_revive15 ] {};
  292. void()  enf_revive15 =[ $death2,  enf_revive16 ] {};
  293. void()  enf_revive16 =[ $death1,  enf_revive17 ] {ai_pain(8);};
  294. void()  enf_revive17 =[ $stand1,  enf_run1     ]
  295. {       self.takedamage = DAMAGE_AIM;   };
  296.  
  297. //--------------------------------------------------------- New Code --------
  298. //  The enforcer springs to his feet!
  299. //---------------------------------------------------------------------------
  300. void()  enf_reviveb1  =[ $fdeath11, enf_reviveb3  ]
  301. {       self.nextthink = self.nextthink + PM_SleepTime();
  302.         self.health = 0;
  303. };
  304. void()  enf_reviveb2  =[ $fdeath11, enf_reviveb3  ]
  305. {       self.nextthink = self.nextthink + 5;    };
  306. void()  enf_reviveb3  =[ $fdeath10, enf_reviveb4  ]
  307. {       // see if ok to stand up
  308.         self.health = 80;
  309.         sound (self, CHAN_VOICE, "enforcer/idle1.wav", 1, ATTN_IDLE);
  310.         self.solid = SOLID_SLIDEBOX;
  311.         if (!walkmove (0, 0))
  312.         {       self.think = enf_revive2;
  313.                 self.solid = SOLID_NOT;
  314.                 return;
  315.         }
  316. };
  317. void()  enf_reviveb4  =[ $fdeath9,  enf_reviveb5  ] {};
  318. void()  enf_reviveb5  =[ $fdeath8,  enf_reviveb6  ] {};
  319. void()  enf_reviveb6  =[ $fdeath7,  enf_reviveb7  ] {ai_painforward(6);};
  320. void()  enf_reviveb7  =[ $fdeath6,  enf_reviveb8  ] {ai_painforward(10);};
  321. void()  enf_reviveb8  =[ $fdeath5,  enf_reviveb9  ] {ai_painforward(12);};
  322. void()  enf_reviveb9  =[ $fdeath4,  enf_reviveb10 ] {ai_painforward(12);};
  323. void()  enf_reviveb10 =[ $fdeath3,  enf_reviveb11 ] {ai_painforward(10);};
  324. void()  enf_reviveb11 =[ $fdeath2,  enf_reviveb12 ] {ai_painforward(10);};
  325. void()  enf_reviveb12 =[ $fdeath1,  enf_reviveb13 ] {ai_painforward(10);};
  326. void()  enf_reviveb13 =[ $stand1,  enf_run1     ]
  327. {      ai_painforward(18);
  328.        sound (self, CHAN_VOICE, "demon/dland2.wav", 1, ATTN_IDLE);
  329.        self.takedamage = DAMAGE_AIM;
  330. };
  331.  
  332. //---------------------------------------------------------------------------
  333.  
  334. void()    enf_die1    =[    $death1,    enf_die2    ] {};
  335. void()    enf_die2    =[    $death2,    enf_die3    ] {};
  336. void()    enf_die3    =[    $death3,    enf_die4    ]
  337. {self.solid = SOLID_NOT;self.ammo_cells = 5;DropBackpack();};
  338. void()    enf_die4    =[    $death4,    enf_die5    ] {ai_forward(14);};
  339. void()    enf_die5    =[    $death5,    enf_die6    ] {ai_forward(2);};
  340. void()    enf_die6    =[    $death6,    enf_die7    ] {};
  341. void()    enf_die7    =[    $death7,    enf_die8    ] {};
  342. void()    enf_die8    =[    $death8,    enf_die9    ] {};
  343. void()    enf_die9    =[    $death9,    enf_die10    ] {ai_forward(3);};
  344. void()    enf_die10    =[    $death10,    enf_die11    ] {ai_forward(5);};
  345. void()    enf_die11    =[    $death11,    enf_die12    ] {ai_forward(5);};
  346. void()    enf_die12    =[    $death12,    enf_die13    ] {ai_forward(5);};
  347. void()    enf_die13    =[    $death13,    enf_die14    ] {};
  348. //--------------------------------------------------------- Code Change -----
  349. void()  enf_die14 =
  350. {       if (PM_Revive())  enf_revive1();
  351.         else   enf_die15();
  352. };
  353. void()  enf_die15       =[      $death14,       enf_die14       ] {};
  354. //---------------------------------------------------------------------------
  355.  
  356. void()    enf_fdie1    =[    $fdeath1,    enf_fdie2    ] {
  357.  
  358. };
  359. void()    enf_fdie2    =[    $fdeath2,    enf_fdie3    ] {};
  360. void()    enf_fdie3    =[    $fdeath3,    enf_fdie4    ] 
  361. {self.solid = SOLID_NOT;self.ammo_cells = 5;DropBackpack();};
  362. void()    enf_fdie4    =[    $fdeath4,    enf_fdie5    ] {};
  363. void()    enf_fdie5    =[    $fdeath5,    enf_fdie6    ] {};
  364. void()    enf_fdie6    =[    $fdeath6,    enf_fdie7    ] {};
  365. void()    enf_fdie7    =[    $fdeath7,    enf_fdie8    ] {};
  366. void()    enf_fdie8    =[    $fdeath8,    enf_fdie9    ] {};
  367. void()    enf_fdie9    =[    $fdeath9,    enf_fdie10    ] {};
  368. void()    enf_fdie10    =[    $fdeath10,    enf_fdie11    ] {};
  369. //--------------------------------------------------------- Code Change -----
  370. void()  enf_fdie11 =
  371. {       if (PM_Revive())  enf_reviveb1();
  372.         else   enf_fdie12();
  373. };
  374. void()  enf_fdie12      =[      $fdeath11,      enf_fdie11      ] {};
  375. //---------------------------------------------------------------------------
  376.  
  377.  
  378. void() enf_die =
  379. {
  380. // check for gib
  381.     if (self.health < -35)
  382.     {
  383.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  384.         ThrowHead ("progs/h_mega.mdl", self.health);
  385.         ThrowGib ("progs/gib1.mdl", self.health);
  386.         ThrowGib ("progs/gib2.mdl", self.health);
  387.         ThrowGib ("progs/gib3.mdl", self.health);
  388.         return;
  389.     }
  390.  
  391. // regular death
  392.     sound (self, CHAN_VOICE, "enforcer/death1.wav", 1, ATTN_NORM);
  393.     if (random() > 0.5)
  394.         enf_die1 ();
  395.     else
  396.         enf_fdie1 ();
  397. };
  398.  
  399.  
  400. /*QUAKED monster_enforcer (1 0 0) (-16 -16 -24) (16 16 40) Ambush
  401.  
  402. */
  403. void() monster_enforcer =
  404. {
  405.     if (deathmatch)
  406.     {
  407.         remove(self);
  408.         return;
  409.     }
  410.     precache_model2 ("progs/enforcer.mdl");
  411.     precache_model2 ("progs/h_mega.mdl");
  412.     precache_model2 ("progs/laser.mdl");
  413.  
  414.     precache_sound2 ("enforcer/death1.wav");
  415.     precache_sound2 ("enforcer/enfire.wav");
  416.     precache_sound2 ("enforcer/enfstop.wav");
  417.     precache_sound2 ("enforcer/idle1.wav");
  418.     precache_sound2 ("enforcer/pain1.wav");
  419.     precache_sound2 ("enforcer/pain2.wav");
  420.     precache_sound2 ("enforcer/sight1.wav");
  421.     precache_sound2 ("enforcer/sight2.wav");
  422.     precache_sound2 ("enforcer/sight3.wav");
  423.     precache_sound2 ("enforcer/sight4.wav");
  424.     
  425.     self.solid = SOLID_SLIDEBOX;
  426.     self.movetype = MOVETYPE_STEP;
  427.  
  428.     setmodel (self, "progs/enforcer.mdl");
  429.  
  430.     setsize (self, '-16 -16 -24', '16 16 40');
  431.     self.health = 80;
  432.  
  433.     self.th_stand = enf_stand1;
  434.     self.th_walk = enf_walk1;
  435.     self.th_run = enf_run1;
  436.     self.th_pain = enf_pain;
  437.     self.th_die = enf_die;
  438.     self.th_missile = enf_atk1;
  439.  
  440.     walkmonster_start();
  441. };
  442.